package com.gimi.cloud.bbp.manage.service.page.impl;

import java.util.ArrayList;
import java.util.List;

import javax.transaction.Transactional;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.gimi.cloud.bbp.common.enums.ResponseCodeEnum;
import com.gimi.cloud.bbp.common.exception.MsgException;
import com.gimi.cloud.bbp.common.utils.MyBeanUtils;
import com.gimi.cloud.bbp.dao.dao.page.PageColumnDao;
import com.gimi.cloud.bbp.dto.page.PageColumnDTO;
import com.gimi.cloud.bbp.entity.page.PageColumn;
import com.gimi.cloud.bbp.entity.page.PageTemplate;
import com.gimi.cloud.bbp.manage.service.page.PageColumnService;
import com.gimi.cloud.bbp.manage.service.page.PageModelService;
import com.gimi.cloud.bbp.manage.service.page.PageTemplateService;

@Service
public class PageColumnServiceImpl implements PageColumnService{
	
	@Autowired private PageColumnDao dao;
	@Autowired private PageTemplateService pageTemplateService;
	@Autowired private PageModelService pageModelService;
	
	@Override
	@Transactional
	public void addColumnByTemplate(PageColumnDTO dto) {
		PageTemplate template = pageTemplateService.getInfoById(dto.getPageTemplateId());
		PageColumn column = JSON.toJavaObject(JSON.parseObject(template.getTemplate()), PageColumn.class);
		MyBeanUtils.copyPropertiesIgnoreNullAndEmptyStr(dto, column);
		add(column, 5);
	}
	
	/**
	 * 根据模板递归添加栏目
	 * @author zhoufuhang
	 * @param column
	 * @param i
	 */
	private void add(PageColumn column, int i) {
		if (i < 1) {
			throw new MsgException(ResponseCodeEnum.RECURSION_ERROR);
		}
		PageColumn result = this.savePageConfig(column);
		List<PageColumn> pageColumns = column.getPageColumns();
		if (pageColumns != null && !pageColumns.isEmpty()) {
			for (PageColumn pageColumn : pageColumns) {
				pageColumn.setpId(result.getId());
				add(pageColumn, i - 1);
			}
		}
	}
	
	
	@Override
	@Transactional
	public PageColumn savePageConfig(PageColumn pageColumn) { 
		PageColumn entity = null;
		if (pageColumn.getId() != null) {
			entity = dao.queryBy("id", pageColumn.getId());
		}
		if (entity != null) {
			MyBeanUtils.copyPropertiesIgnoreNullAndEmptyStr(pageColumn, entity);
			dao.baseUpdateByPrimaryKey(entity);
		} else {
			entity = pageColumn;
			entity.setIsDelete(0);
			dao.insertUseGeneratedKeys(entity);
		}
		return entity;
	}
	
	@Override
	public PageColumn getInfoById(PageColumnDTO dto) {
		return dao.queryBy("id", dto.getId());
	}
	
	@Override
	@Transactional
	public void delAll(Integer id){
		PageColumnDTO pageColumn = dao.getPageColumnById(id);
		if (pageColumn == null) {
			throw new MsgException(ResponseCodeEnum.UNKNOWN_ERROR);
		}
		List<Integer> columId = new ArrayList<>();
		getDelIds(pageColumn, 5, columId);
		this.delInfo(columId.toArray(new Integer[] {}));
	}
	
	/**
	 * 递归删除所有栏目
	 * @author zhoufuhang
	 * @param column
	 * @param i
	 * @param columIds
	 */
	private void getDelIds(PageColumnDTO column, int i, List<Integer> columIds) {
		columIds.add(column.getId());
		List<PageColumnDTO> columns = column.getPageColumns();
		if (columns == null || columns.isEmpty()) {
			return;
		}
		for (PageColumnDTO pageColumn : columns) {
			if (pageColumn != null) {
				getDelIds(pageColumn, i - 1, columIds);
			}
		}
	}
	
	@Override
	@Transactional
	public void delInfo(Integer... ids){
		if (ids == null || ids.length < 1) {
			throw new MsgException(ResponseCodeEnum.PARAMETER_ERROR);
		}
		//先删除数据信息
		pageModelService.delInfoByColumnId(ids);
		//再删除栏目信息
		dao.delById(StringUtils.join(ids, ","));
	}
}
